def run():
    print("跑步")
    # print("健身")
# 我有一个需求：
# 1、在不改变run方法调用的情况下，增加健身功能
# 2、也不能修改里面的代码
# run()
# 没有实现需求
"""
def runs():
    print("跑步")
    print("健身")
runs()
"""

# 用到装饰器来增加修饰
# 定义了一个装饰器
"""
def runs(func):     # func就是传入被修饰的方法形参
    def luoji():        # 编写逻辑代码
        print("健身")     # 引入新的功能
        func()  # 调用原来的函数
    return luoji        # 外函数返回子函数的地址值
# 调用装饰器，把要修饰的方法传进去
run = runs(run)
run()
"""
"""
装饰器的语法：
def 函数a(func):
    def 函数b():
        func()
        ....
    return 函数b
"""
# 写一个增加自我介绍的装饰器

def info(func):
    def luoji(*args,**kwargs):
        print("大家好，我叫做：%s"%args[0])
        func()
        print("今年：%s岁"%args[1])
    return luoji
@info       # 简化引用，直接使用@+函数的名称就可以
def 刘超():
    print("我是刘超函数")
"""
# 为它增加修饰，有自我介绍
l = info(刘超)
l("刘超",29)
"""
# 刘超("班长",19)

# 装饰器案例二：
def names(func):
    def info(name,age,sex,address):
        func(name)
        print(f"我今年：{age}岁，性别为：{sex}，来自：{address}")
    return info
# 为普通函数增加装饰器功能
@names
def __name(name):
    print(f"我叫做：{name}")

# 调用函数
__name("刘超",100,'女','辽宁沈阳')
"""
print(f"我叫做：{name}")
print(f"我今年：{age}岁，性别为：{sex}，来自：{address}")
"""














